﻿#include <opencv2/opencv.hpp>
#include <iostream>
#include <thread>
#include <chrono>
#include <regex>

// 显示比特颜色的函数
void displayColor(bool bit) {
    cv::Mat image(cv::Size(cv::getWindowImageRect("Display").width, cv::getWindowImageRect("Display").height), CV_8UC3, cv::Scalar(255 * !bit, 255 * !bit, 255 * !bit));
    cv::imshow("Display", image);
    cv::waitKey(1);
}

// 显示起始和结束信号的函数
void displaySignal(cv::Scalar color, bool backgroundWhite) {
    int width = cv::getWindowImageRect("Display").width;
    int height = cv::getWindowImageRect("Display").height;
    int radius = std::min(width, height) / 5;
    cv::Mat image(cv::Size(width, height), CV_8UC3, cv::Scalar(255 * backgroundWhite, 255 * backgroundWhite, 255 * backgroundWhite));
    cv::circle(image, cv::Point(width / 2, height / 2), radius, color, -1);
    cv::imshow("Display", image);
    cv::waitKey(1);
}

// 显示间隔帧的函数
void displayStripeFrame() {
    int width = cv::getWindowImageRect("Display").width;
    int height = cv::getWindowImageRect("Display").height;
    cv::Mat image(cv::Size(width, height), CV_8UC3, cv::Scalar(0, 0, 0));
    int stripeHeight = height / 3;
    cv::rectangle(image, cv::Point(0, stripeHeight), cv::Point(width, stripeHeight * 2), cv::Scalar(255, 255, 255), -1);
    cv::imshow("Display", image);
    cv::waitKey(1);
}

// 校验输入的二进制字符串
bool validateInput(const std::string& input) {
    return std::regex_match(input, std::regex("^[01]+$"));
}

int main() {
    std::string input;
    std::cout << "请输入要发送的二进制字符串: ";
    std::cin >> input;

    // 校验输入
    if (!validateInput(input)) {
        std::cerr << "输入非法，请输入仅包含0和1的二进制字符串!" << std::endl;
        return -1;
    }

    double interval = 0.5; // 信号间隔时间

    // 全屏显示
    cv::namedWindow("Display", cv::WINDOW_NORMAL);
    cv::setWindowProperty("Display", cv::WND_PROP_FULLSCREEN, cv::WINDOW_FULLSCREEN);

    // 显示起始信号
    displaySignal(cv::Scalar(255, 255, 255), false); // 白色圆圈，黑色背景
    std::this_thread::sleep_for(std::chrono::duration<double>(interval));

    // 显示比特信号
    for (char bit : input) {
        displayColor(bit == '1');
        std::this_thread::sleep_for(std::chrono::duration<double>(interval));

        // 显示间隔帧
        displayStripeFrame();
        std::this_thread::sleep_for(std::chrono::duration<double>(interval));
    }

    // 显示结束信号
    displaySignal(cv::Scalar(0, 0, 0), true); // 黑色圆圈，白色背景
    std::this_thread::sleep_for(std::chrono::duration<double>(3));

    return 0;
}
